#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<string.h>
#include<sys/types.h>
#include<sys/wait.h>

int main()
{
  pid_t id = fork();
  if(id == 0)
  {
    //子进程
    int cnt = 5;
    while(cnt)
    {
      printf("我是子进程，我还在，我还有%dS,pid :%d,ppid :%d\n",cnt--,getpid(),getppid());
      sleep(1);
    }
    exit(111);
  }
  //父进程
  int status = 0;
  while(1)
  {
     pid_t ret_id = waitpid(id,&status,WNOHANG);
    if(ret_id == -1)
    {
      printf("waited error\n");
      exit(-1);
    }
    else if(ret_id == 0)
    {
      printf("子进程还没有退出，我做其他事情，处于阻塞轮询状态\n");
      sleep(1);
      continue;
    }
    else
    {
      if(WIFEXITED(status))
      {
        printf("wait sucess,child exit code :%d\n",WEXITSTATUS(status));
      }
      else 
      {
        printf("wait sucess,child exit signal :%d\n",status & 0x7F);
      }
      printf("我是父进程，我等待子进程成功,pid:%d,ppid:%d,ret_id:%d,child exit code:%d,child exit signal:%d\n",\
        getpid(),getppid(),ret_id,(status>>8) & 0xFF, status & 0x7F);
      break;
    }
  }

}

//int main() {
//  for(int i=0;i<100;i++)
//  {
//    printf("%d:%s\n" ,i,strerror(i));
//    _exit(111);
//  }
//  return 0;
//}

//
//int add_to_top(int top)
//{
//  int sum=0;
//  for(int i=0;i<=top;i++)
//  {
//    sum += i;
//  }
//  exit(123);
//  return sum;
//}
//int main()
//{
//
//  int result = add_to_top(100);
//  if(result == 5050)
//  {
//    return 0;
//  }
//  else 
//  {
//    //表示计算结果不正确
//    return 1;
//  } 
//}
